package com.wiener.core.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import oracle.jdbc.OracleTypes;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import com.wiener.core.beans.Notas;
import com.wiener.core.beans.Prospecto;
import com.wiener.core.beans.ProspectoDetalle;
import com.wiener.core.commons.Constants;
import com.wiener.core.domain.Entidad;
import com.wiener.core.jdbc.ExecuteProcedure;

@Repository
public class ProspectoDAOImpl extends HibernateDaoSupport implements
		ProspectoDAO {

	private JdbcTemplate jdbcTemplate;
	private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
	private DataSource dataSource;
	private ExecuteProcedure execSp;
	private Connection connection;
	private CallableStatement callableStatement = null;
	private ResultSet rs;

	@Autowired
	public ProspectoDAOImpl(SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}

	public Connection getConexion() throws Exception {
		dataSource = SessionFactoryUtils.getDataSource(getSession()
				.getSessionFactory());
		if (connection == null) {
			connection = dataSource.getConnection();
		}
		return connection;

	}

	public Prospecto buscarCebeceraProspecto(String dni) {

		Prospecto prospecto = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_carga_cliente_inf(?,?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.setString(1, dni);
			callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(2);

			if (rs != null) {
				while (rs.next()) {

					prospecto = new Prospecto(rs.getString(1), rs.getString(2),
							rs.getString(3), rs.getString(4), rs.getString(5),
							rs.getString(6), rs.getString(7), rs.getString(8),
							rs.getDate(9), rs.getString(10), rs.getString(11),
							rs.getString(12), rs.getString(13),
							rs.getString(14), rs.getString(15),
							rs.getString(16), rs.getString(17),
							rs.getString(18), rs.getString(19),
							rs.getString(20), rs.getString(21),
							rs.getString(22), rs.getString(23),
							rs.getString(24), rs.getString(25),
							rs.getString(26), rs.getString(27),
							rs.getString(28), rs.getString(29),
							rs.getString(30));

					break;
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return prospecto;
	}

	public List<Entidad> buscarTipoCaptacion() throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_tipocapta(?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(1);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(2), rs.getString(1));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarCategoria() throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_categoria(?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(1);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(2), rs.getString(1));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarPaises() throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_paises(?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(1);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(2), rs.getString(1));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarTipoDocumentos() throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_tipodocumento(?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(1);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(2), rs.getString(1));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarGenero() throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_tiposexo(?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(1);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(1), rs.getString(2));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarModoAcercamiento() throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_MODO_ACERCAMIENTO(?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(1);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(1), rs.getString(2));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarDescripcionAcercamiento(String asMedio)
			throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_DESCRIPCION_ACERCAMIENTO(?,?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.setString(1, asMedio);
			callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(2);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(1), rs.getString(2));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarDetalleAcercamiento(String asMedio)
			throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_DETALLE_ACERCAMIENTO(?,?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.setString(1, asMedio);
			callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(2);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(1), rs.getString(2));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarMedioAtencion() throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_MEDIO_ATENCION(?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(1);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(1), rs.getString(2));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarTipoInstitucion() throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_tipoinstitucion(?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(1);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(1), rs.getString(2));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarTipoGrado() throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_tipogrado(?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(1);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(2), rs.getString(1));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarTipoEmpresa() throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_tipoempresa(?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(1);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(1), rs.getString(2));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<ProspectoDetalle> buscarProspectoDetalle(String codigoAtencion) {

		List<ProspectoDetalle> lista = new ArrayList<ProspectoDetalle>();
		ProspectoDetalle prospectoDetalle = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_carga_atencion_inf(?,?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.setString(1, codigoAtencion);
			callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(2);

			if (rs != null) {
				while (rs.next()) {

					prospectoDetalle = new ProspectoDetalle(rs.getString(1),
							rs.getString(2), rs.getString(3), rs.getString(4),
							rs.getString(5), rs.getString(6), rs.getString(7),
							rs.getString(8), rs.getString(9), rs.getString(10),
							rs.getString(11), rs.getString(12),
							rs.getString(13), rs.getInt(14));
					lista.add(prospectoDetalle);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarDepartamento(String codigoPais) throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_region(?,?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.setString(1, codigoPais);
			callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(2);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(2), rs.getString(1));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarProvincia(String codigoPais, String codDepa)
			throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_provincia(?,?,?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.setString(1, codigoPais);
			callableStatement.setString(2, codDepa);
			callableStatement.registerOutParameter(3, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(3);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(2), rs.getString(1));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarDistrito(String codigoPais, String codDepa,
			String codProv) throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_distrito(?,?,?,?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.setString(1, codigoPais);
			callableStatement.setString(2, codDepa);
			callableStatement.setString(3, codProv);
			callableStatement.registerOutParameter(4, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(4);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(2), rs.getString(1));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public void guardarProspecto(Prospecto prospecto, String opcion) {

		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_mante_informes(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";
			
			System.out.println(prospecto.toString());
			
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.setString(1, opcion);
			callableStatement.setString(2, prospecto.getClienteInformes());
			callableStatement.setString(3, prospecto.getPaisOrigen());
			callableStatement.setString(4, prospecto.getTipoDocumento());
			callableStatement.setString(5, prospecto.getNumeroDocumento());
			callableStatement.setString(6, prospecto.getApePaterno());
			callableStatement.setString(7, prospecto.getApeMaterno());
			callableStatement.setString(8, prospecto.getNombres());
			callableStatement.setString(9, prospecto.getSexo());
			java.sql.Date sqlDate = new java.sql.Date(prospecto
					.getFechaNacimiento().getTime());
			callableStatement.setDate(10, sqlDate);
			callableStatement.setString(11, prospecto.getDireccion());
			callableStatement.setString(12, prospecto.getPaisResidencia());
			callableStatement.setString(13, prospecto.getDepartamento());
			callableStatement.setString(14, prospecto.getProvincia());
			callableStatement.setString(15, prospecto.getDistrito());
			callableStatement.setString(16, prospecto.getEmail());
			callableStatement.setString(17, prospecto.getTelefonoFijo());
			callableStatement.setString(18, prospecto.getTelefonoMovil());
			callableStatement.setString(19, prospecto.getComoSeEntero());
			callableStatement.setString(20, prospecto.getMedioPublicitario());
			callableStatement.setString(21, prospecto.getDetalleAcercamiento());
			callableStatement.setString(22, prospecto.getMedioAtencio());
			callableStatement.setString(23, prospecto.getPaisEstudios());
			callableStatement.setString(24, prospecto.getTipoEstudios());
			callableStatement.setString(25, prospecto.getNivelEstudios());
			callableStatement.setString(26, prospecto.getAnhoFinEstudios());
			callableStatement.setString(27, prospecto.getInstEstudios());
			callableStatement.setString(28, prospecto.getLugarTrabajo());
			callableStatement.setString(29, prospecto.getTipoLugarTrabajo());
			callableStatement.setString(30, prospecto.getCargoLugarTrabajo());
			callableStatement.setString(31, prospecto.getAnhosExperiencia());

			callableStatement.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {

		}

	}

	public void guardarProspectoDetalle(ProspectoDetalle prospectoDetalle,
			String opcion, String tipoCaptacion, String categoria,
			String usuario, String atencion) {

		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_mante_ate_informes(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);

			callableStatement.setString(1, opcion);
			callableStatement.setString(2, prospectoDetalle.getCliente());
			callableStatement.setString(3, atencion);
			callableStatement.setString(4, tipoCaptacion);
			callableStatement.setString(5, categoria);
			callableStatement.setString(6, prospectoDetalle.getFlagCaptacion());
			callableStatement.setString(7, prospectoDetalle.getInstitucion());
			callableStatement.setString(8, prospectoDetalle.getCarrera());
			callableStatement.setString(9, prospectoDetalle.getPeriodo());
			callableStatement.setString(10, prospectoDetalle.getMes());
			callableStatement.setString(11, prospectoDetalle.getModalidad());
			callableStatement.setString(12, prospectoDetalle.getSeccion());
			callableStatement.setString(13, prospectoDetalle.getMesInicio());
			callableStatement.setString(14, prospectoDetalle.getMatricula());
			callableStatement.setString(15, usuario);

			callableStatement.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {

		}

	}

	// grilla
	// sp_institucion1
	// sp_carrera_inst1
	// sp_periodo1
	// sp_periodo_det1
	// sp_codmod1

	public List<Entidad> buscarInstitucion1() throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_institucion1(?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(1);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(1), rs.getString(2));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarCarrera1(String codInstitucion) throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_carrera_inst1(?,?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.setString(1, codInstitucion);
			callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(2);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(1), rs.getString(2));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarPeriodo1(String codInstitucion) throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_periodo1(?,?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.setString(1, codInstitucion);
			callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(2);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(1), rs.getString(2));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	public List<Entidad> buscarModalidad1(String codInstitucion)
			throws Exception {

		List<Entidad> lista = new ArrayList<Entidad>();
		Entidad entidad = null;
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_codmod1(?,?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.setString(1, codInstitucion);
			callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
			callableStatement.executeUpdate();

			rs = (ResultSet) callableStatement.getObject(2);

			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(1), rs.getString(2));
					lista.add(entidad);

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lista;
	}

	
	
	public List<Entidad> buscarPeriodoDetalle(String periodo, String codInstitucion) throws Exception {

		List<Entidad> resultado = new ArrayList<Entidad>();
		
		try {

			String getDBUSERByUserIdSql = "{call UP100.PKG_EVIRTUAL_PROSPECTO.sp_periodo_det1(?,?,?)}";
			callableStatement = getConexion().prepareCall(getDBUSERByUserIdSql);
			callableStatement.setString(1, periodo);
			callableStatement.setString(2, codInstitucion);
			callableStatement.registerOutParameter(3, OracleTypes.CURSOR);
			callableStatement.executeUpdate();
			Entidad entidad;
			rs = (ResultSet)callableStatement.getObject(3);
			if (rs != null) {
				while (rs.next()) {

					entidad = new Entidad(rs.getString(1), rs.getString(2),rs.getString(3));
					resultado.add(entidad);

				}
			}
			

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (callableStatement != null) {
					callableStatement.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return resultado;
	}
	
}
